package com.chao.common.codeGeneration.source;

import com.chao.common.codeGeneration.bean.Table;
import com.chao.common.codeGeneration.bean.TableColumns;
import com.chao.common.codeGeneration.generation.FileUtile;
import com.chao.common.codeGeneration.generation.Generation;
import com.chao.common.util.DateUtile;
import com.chao.common.util.exception.SysException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;

public class ToDB {

//    public static void toFeign(Table table, String path){
//        //封装DB路径
//        String servicePag = Start.DB;
//        path = path + String.format(CodeConstant.SERVICE_PATH,Start.DB,servicePag,table.getPacName());
//
//        File file = FileUtile.createFile(path+"\\feign\\"+table.getPojoKey()+"Feign.java");
//        try(Writer out =new FileWriter(file)) {
//            List<String> fun = Arrays.asList(table.getFunction());
//            StringBuilder sb = new StringBuilder();
//            // package
//            sb.append("package com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".feign;").append("\r\n\r\n");
//
//            //import
//            sb.append("import com.alibaba.fastjson.JSONObject;").append("\r\n");
//            sb.append("import com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".mapper.").append(table.getPojoKey()).append("Mapper;").append("\r\n");
//            sb.append("import org.springframework.beans.factory.annotation.Autowired;").append("\r\n");
//            sb.append("import org.springframework.web.bind.annotation.*;").append("\r\n");
//            if(fun.contains("批量新增")){
//                sb.append("import java.util.List;").append("\r\n");
//            }
//
//            //Class
//            sb.append("\r\n").append("\r\n");
//            sb.append("/**").append("\r\n");
//            sb.append(" * ").append(table.getPojoName()).append("Feign 生产端").append("\r\n");
//            sb.append(" * ").append(Generation.author).append("\r\n");
//            sb.append(" * ").append(DateUtile.toYmd()).append("\r\n");
//            sb.append(" */").append("\r\n");
//            sb.append("@RestController").append("\r\n");
//            sb.append("@RequestMapping(\"/").append(table.getUpojoKey()).append("\")").append("\r\n");
//            sb.append("public class ").append(table.getPojoKey()).append("Feign {").append("\r\n");
//
//            //mapper
//            sb.append("\r\n");
//            sb.append("\r\n");
//            sb.append("\t/**").append("\r\n");
//            sb.append("\t * ").append(table.getPojoName()).append("Mapper").append("\r\n");
//            sb.append("\t */").append("\r\n");
//            sb.append("\t@Autowired").append("\r\n");
//            sb.append("\tprivate ").append(table.getPojoKey()).append("Mapper ").append(table.getUpojoKey()).append("Mapper;").append("\r\n");
//
//            //函数
//            //获取主键
//            TableColumns col = null;
//            for(TableColumns column: table.getColumns()){
//                if(column.getKey()){
//                    col = column;
//                }
//            }
//            if(col == null){
//                throw new SysException("数据表未设置主键!");
//            }
//            if(fun.contains("新增")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 新增").append(table.getPojoName()).append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/insert").append(table.getPojoKey()).append("\")").append("\r\n");
//                sb.append("\tObject insert").append(table.getPojoKey()).append("(@RequestBody JSONObject ").append(table.getUpojoKey()).append("){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.insert").append(table.getPojoKey()).append("(").append(table.getUpojoKey()).append(");").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            if(fun.contains("批量新增")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 批量新增").append(table.getPojoName()).append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/insertAll").append(table.getPojoKey()).append("\")").append("\r\n");
//                sb.append("\tObject insertAll").append(table.getPojoKey()).append("(@RequestBody List<JSONObject> ").append(table.getUpojoKey()).append("List){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.insertAll").append(table.getPojoKey()).append("(").append(table.getUpojoKey()).append("List);").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            if(fun.contains("修改")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 修改").append(table.getPojoName()).append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/update").append(table.getPojoKey()).append("\")").append("\r\n");
//                sb.append("\tObject update").append(table.getPojoKey()).append("(@RequestBody JSONObject ").append(table.getUpojoKey()).append("){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.update").append(table.getPojoKey()).append("(").append(table.getUpojoKey()).append(");").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            if(fun.contains("逻辑删除")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 删除").append(table.getPojoName()).append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/delete").append(table.getPojoKey()).append("\")").append("\r\n");
//                sb.append("\tObject delete").append(table.getPojoKey()).append("(@RequestParam(\"").append(col.getLowercaseName()).append("\") String ").append(col.getLowercaseName()).append("){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.delete").append(table.getPojoKey()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            if(fun.contains("物理删除")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 物理删除").append(table.getPojoName()).append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/deleteData").append(table.getPojoKey()).append("\")").append("\r\n");
//                sb.append("\tObject deleteData").append(table.getPojoKey()).append("(@RequestParam(\"").append(col.getLowercaseName()).append("\") String ").append(col.getLowercaseName()).append("){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.deleteData").append(table.getPojoKey()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            if(fun.contains("查询详情")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 查询").append(table.getPojoName()).append("详情").append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/select").append(table.getPojoKey()).append("ById\")").append("\r\n");
//                sb.append("\tObject select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(@RequestParam(\"").append(col.getLowercaseName()).append("\") String ").append(col.getLowercaseName()).append("){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            if(fun.contains("查询列表") || fun.contains("分页查询")){
//                sb.append("\r\n");
//                sb.append("\t/**").append("\r\n");
//                sb.append("\t * 查询").append(table.getPojoName()).append("列表").append("\r\n");
//                sb.append("\t */").append("\r\n");
//                sb.append("\t@PostMapping(\"/select").append(table.getPojoKey()).append("ByList\")").append("\r\n");
//                sb.append("\tObject select").append(table.getPojoKey()).append("ByList(@RequestBody JSONObject json){").append("\r\n");
//                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("ByList(json);").append("\r\n");
//                sb.append("\t}").append("\r\n");
//            }
//
//            sb.append("\r\n");
//            sb.append("}");
//            out.write(sb.toString());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        toMapper(table,path);
//    }


    public static void toMapper(Table table, String path){
        String servicePag = table.getService();
        File file = FileUtile.createFile(path+"\\mapper\\"+table.getPojoKey()+"Mapper.java");
        try(Writer out =new FileWriter(file)) {
            List<String> fun = Arrays.asList(table.getFunction());
            StringBuilder sb = new StringBuilder();
            // package
            sb.append("package com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".mapper;").append("\r\n\r\n");

            //import
            sb.append("import com.alibaba.fastjson.JSONObject;").append("\r\n");
            sb.append("import org.apache.ibatis.annotations.Param;").append("\r\n");
            sb.append("import org.springframework.stereotype.Repository;").append("\r\n");
            sb.append("import com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".bean.").append(table.getPojoKey()).append(";").append("\r\n");
            if(fun.contains("批量新增")){
                sb.append("import java.util.List;").append("\r\n");
            }
            if(fun.contains("分页查询") || fun.contains("查询列表")){
                sb.append("import com.chao.common.util.reaction.PageList;").append("\r\n");
            }

            //Class
            sb.append("\r\n").append("\r\n");
            sb.append("/**").append("\r\n");
            sb.append(" * ").append(table.getPojoName()).append("Mapper").append("\r\n");
            sb.append(" * ").append(Generation.author).append("\r\n");
            sb.append(" * ").append(DateUtile.toYmd()).append("\r\n");
            sb.append(" */").append("\r\n");
            sb.append("@Repository").append("\r\n");
            sb.append("public interface ").append(table.getPojoKey()).append("Mapper {").append("\r\n");

            //函数
            //获取主键
            TableColumns col = null;
            for(TableColumns column: table.getColumns()){
                if(column.getKey()){
                    col = column;
                }
            }

            if(col == null){
                throw new SysException("数据表未设置主键!");
            }
            if(fun.contains("新增")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 新增").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tint insert").append(table.getPojoKey()).append("(").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(");").append("\r\n");
            }

            if(fun.contains("批量新增")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 批量新增").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tint insertAll").append(table.getPojoKey()).append("(@Param(\"").append(table.getUpojoKey()).append("List\") List<").append(table.getPojoKey()).append("> ").append(table.getUpojoKey()).append("List);").append("\r\n");
            }

            if(fun.contains("修改")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 修改").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tint update").append(table.getPojoKey()).append("(").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(");").append("\r\n");
            }

            if(fun.contains("逻辑删除")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 删除").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tint delete").append(table.getPojoKey()).append("(String ").append(col.getLowercaseName()).append(");").append("\r\n");
            }

            if(fun.contains("物理删除")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 物理删除").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tint deleteData").append(table.getPojoKey()).append("(String ").append(col.getLowercaseName()).append(");").append("\r\n");
            }

            if(fun.contains("查询详情")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 查询").append(table.getPojoName()).append("详情").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t").append(table.getPojoKey()).append(" select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(String ").append(col.getLowercaseName()).append(");").append("\r\n");
            }

            if(fun.contains("查询列表") || fun.contains("分页查询")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 查询").append(table.getPojoName()).append("列表").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tPageList<").append(table.getPojoKey()).append("> select").append(table.getPojoKey()).append("ByList(@Param(\"json\") JSONObject json);").append("\r\n");
            }

            sb.append("\r\n");
            sb.append("}");
            out.write(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        toXml(table,path);
    }

    public static void toXml(Table table, String path){
        String servicePag = table.getService();
        File file = FileUtile.createFile(path+"\\xml\\"+table.getPojoKey()+"Mapper.xml");
        try(Writer out =new FileWriter(file)) {
            List<String> fun = Arrays.asList(table.getFunction());
            StringBuilder sb = new StringBuilder();

            //获取主键
            TableColumns col = null;
            for(TableColumns column: table.getColumns()){
                if(column.getKey()){
                    col = column;
                }
            }
            if(col == null){
                throw new SysException("数据表未设置主键!");
            }

            // 头部
            sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>").append("\r\n");
            sb.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >").append("\r\n");
            sb.append("<!-- ").append(table.getPojoName()).append("XML -->").append("\r\n");
            sb.append("<mapper namespace=\"com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".mapper.").append(table.getPojoKey()).append("Mapper\">").append("\r\n");
            sb.append("\t<!-- ").append(table.getPojoName()).append("Bean -->").append("\r\n");
            sb.append("\t<resultMap id=\"").append(table.getUpojoKey()).append("ResultMap\" type=\"com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".bean.").append(table.getPojoKey()).append("\">").append("\r\n");
            //字段说明
            for(TableColumns column: table.getColumns()){
                sb.append("\t\t<!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                sb.append("\t\t<result column=\"").append(column.getColumnName()).append("\" property=\"").append(column.getLowercaseName()).append("\" jdbcType=\"").append(column.getDataType()).append("\" />").append("\r\n");
            }
            sb.append("\t</resultMap>").append("\r\n");

            if(fun.contains("新增")){
                sb.append("\r\n");
                sb.append("\t<!-- 新增").append(table.getPojoName()).append(" -->").append("\r\n");
                sb.append("\t<insert id=\"insert").append(table.getPojoKey()).append("\" parameterType=\"com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".bean.").append(table.getPojoKey()).append("\">").append("\r\n");
                sb.append("\t\tinsert into ").append(table.getTableName()).append("\r\n");
                sb.append("\t\t<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    sb.append("\t\t\t<!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    sb.append("\t\t\t<if test=\"").append(column.getLowercaseName()).append(" != null\">").append("\r\n");
                    sb.append("\t\t\t\t").append(column.getColumnName()).append(",").append("\r\n");
                    sb.append("\t\t\t</if>").append("\r\n");
                }
                sb.append("\t\t</trim>").append("\r\n");
                sb.append("\t\t<trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    sb.append("\t\t\t<!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    sb.append("\t\t\t<if test=\"").append(column.getLowercaseName()).append(" != null\">").append("\r\n");
                    sb.append("\t\t\t\t#{").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("},").append("\r\n");
                    sb.append("\t\t\t</if>").append("\r\n");
                }
                sb.append("\t\t</trim>").append("\r\n");
                sb.append("\t</insert>").append("\r\n");
            }

            if(fun.contains("批量新增")){
                sb.append("\r\n");
                sb.append("\t\t<!-- 批量新增").append(table.getPojoName()).append(" -->").append("\r\n");
                sb.append("\t<insert id=\"insertAll").append(table.getPojoKey()).append("\">").append("\r\n");
                sb.append("\t\tinsert into ").append(table.getTableName()).append(" (").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    if(!column.getEnd()){
                        sb.append("\t\t\t").append(column.getColumnName()).append(", <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }else{
                        sb.append("\t\t\t").append(column.getColumnName()).append(" <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }
                }
                sb.append("\t\t)").append("\r\n");
                sb.append("\t\t<foreach collection=\"").append(table.getUpojoKey()).append("List\" open=\"values\" separator=\",\" item=\"item\">").append("\r\n");
                sb.append("\t\t(").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    if(!column.getEnd()){
                        sb.append("\t\t\t#{item.").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("}, <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }else{
                        sb.append("\t\t\t#{item.").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("} <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }
                }
                sb.append("\t\t)").append("\r\n");
                sb.append("\t\t</foreach>").append("\r\n");
                sb.append("\t</insert>").append("\r\n");
            }

            if(fun.contains("修改")){
                //下列字段不允许修改接口更新
                List<String> noUpdate = Arrays.asList("is_del","create_user_id","ctime");
                sb.append("\r\n");
                sb.append("\t<!-- 修改").append(table.getPojoName()).append(" -->").append("\r\n");
                sb.append("\t<update id=\"update").append(table.getPojoKey()).append("\" parameterType=\"com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".bean.").append(table.getPojoKey()).append("\">").append("\r\n");
                sb.append("\t\tupdate ").append(table.getTableName()).append(" set").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    if(noUpdate.contains(column.getColumnName())){
                        //如果最后一个字段不允许修改,则删除上一个逗号
                        if(column.getEnd()){
                            sb.deleteCharAt(sb.lastIndexOf(","));
                        }
                        continue;
                    }
                    if(!column.getEnd()){
                        sb.append("\t\t\t").append(column.getColumnName()).append(" = #{").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("}, <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }else{
                        sb.append("\t\t\t").append(column.getColumnName()).append(" = #{").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("} <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }
                }
                sb.append("\t\twhere ").append(col.getColumnName()).append(" = #{").append(col.getLowercaseName()).append(",jdbcType=").append(col.getDataType()).append("}").append("\r\n");
                sb.append("\t</update>").append("\r\n");
            }

            if(fun.contains("逻辑删除")){
                sb.append("\r\n");
                sb.append("\t<!-- 逻辑删除").append(table.getPojoName()).append(" -->").append("\r\n");
                sb.append("\t<update id=\"delete").append(table.getPojoKey()).append("\" parameterType=\"java.lang.String\">").append("\r\n");
                sb.append("\t\tupdate ").append(table.getTableName()).append(" set ");
                boolean flag = false;
                for(TableColumns column: table.getColumns()){
                    if("is_del".equals(column.getColumnName())){
                        flag = true;
                        sb.append(column.getColumnName()).append(" = 1 ");
                    }
                }
                if(!flag){
                    throw new SysException("数据表未设置删除字段,无法逻辑删除!");
                }
                sb.append("where ").append(col.getColumnName()).append(" = #{").append(col.getLowercaseName()).append(",jdbcType=").append(col.getDataType()).append("}").append("\r\n");
                sb.append("\t</update>").append("\r\n");
            }

            if(fun.contains("物理删除")){
                sb.append("\r\n");
                sb.append("\t<!-- 物理删除").append(table.getPojoName()).append(" -->").append("\r\n");
                sb.append("\t<delete id=\"deleteData").append(table.getPojoKey()).append("\" parameterType=\"java.lang.String\">").append("\r\n");
                sb.append("\t\tdelete from ").append(table.getTableName()).append(" where ");
                sb.append(col.getColumnName()).append(" = #{").append(col.getLowercaseName()).append(",jdbcType=").append(col.getDataType()).append("}").append("\r\n");
                sb.append("\t</delete>").append("\r\n");
            }

            if(fun.contains("查询详情") && (fun.contains("查询列表") || fun.contains("分页查询"))){
                //下列字段不参与查询条件
                List<String> noUpdate = Arrays.asList("is_del","create_user_id","ctime","utime");
                sb.append("\r\n");
                sb.append("\t<!-- 查询sql -->").append("\r\n");
                sb.append("\t<sql id=\"").append(table.getUpojoKey()).append("_base_sql\">").append("\r\n");
                sb.append("\t\tselect").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    if(!column.getEnd()){
                        sb.append("\t\t\tt.").append(column.getColumnName()).append(", <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }else{
                        sb.append("\t\t\tt.").append(column.getColumnName()).append(" <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }
                }
                sb.append("\t\tfrom ").append(table.getTableName()).append(" t where ");
                if(fun.contains("逻辑删除")){
                    sb.append("t.is_del = 0").append("\r\n");
                }else{
                    sb.append("1=1").append("\r\n");
                }
                sb.append("\t</sql>").append("\r\n");
                sb.append("\r\n");

                sb.append("\t<!-- 查询").append(table.getPojoName()).append("详情 -->").append("\r\n");
                sb.append("\t<select id=\"select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("\" resultMap=\"").append(table.getUpojoKey()).append("ResultMap\" parameterType=\"java.lang.String\">").append("\r\n");
                sb.append("\t\t<include refid=\"").append(table.getUpojoKey()).append("_base_sql\" />").append("\r\n");
                sb.append("\t\tand t.").append(col.getColumnName()).append(" = #{").append(col.getLowercaseName()).append(",jdbcType=VARCHAR}").append("\r\n");
                sb.append("\t</select>").append("\r\n");
                sb.append("\r\n");
                sb.append("\t<!-- 查询").append(table.getPojoName()).append("列表 -->").append("\r\n");
                sb.append("\t<select id=\"select").append(table.getPojoKey()).append("ByList\" resultMap=\"").append(table.getUpojoKey()).append("ResultMap\">").append("\r\n");
                sb.append("\t\t<include refid=\"").append(table.getUpojoKey()).append("_base_sql\" />").append("\r\n");
                boolean isCtime = false;
                TableColumns isProject = null;
                for(TableColumns column: table.getColumns()){
                    if("ctime".equals(column.getColumnName())){
                        isCtime = true;
                    }
                    if(noUpdate.contains(column.getColumnName())){
                        continue;
                    }
                    if("projectId".equals(column.getLowercaseName())){
                        isProject = column;
                    }
                    sb.append("\t\t<!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    sb.append("\t\t<if test=\"json.").append(column.getLowercaseName()).append(" != null\">").append("\r\n");
                    sb.append("\t\t\tand t.").append(column.getColumnName()).append(" = #{json.").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("}").append("\r\n");
                    sb.append("\t\t</if>").append("\r\n");
                }
                //如果字段中包含项目id 并且是客户应用 则增加权限查询
                if(null != isProject){
                    sb.append("\t\t<!-- 项目权限 -->").append("\r\n");
                    sb.append("\t\t<if test=\"@com.chao.common.util.RequestUtile@isLoginUserRole() != null\">").append("\r\n");
                    sb.append("\t\t\tand t.").append(isProject.getColumnName()).append(" in (\n");
                    sb.append("\t\t\t\tselect pu.project_id from yh_project_user pu where pu.user_id = ${@com.chao.common.util.RequestUtile@isLoginUserRole()}\r\n");
                    sb.append("\t\t\t)\r\n");
                    sb.append("\t\t</if>").append("\r\n");
                }
                if(isCtime){
                    sb.append("\t\torder by t.ctime DESC").append("\r\n");
                }
                sb.append("\t</select>").append("\r\n");
            }else if(fun.contains("查询详情")){
                sb.append("\r\n");
                sb.append("\t<!-- 查询").append(table.getPojoName()).append("详情 -->").append("\r\n");
                sb.append("\t<select id=\"select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("\" resultMap=\"").append(table.getUpojoKey()).append("ResultMap\" parameterType=\"java.lang.String\">").append("\r\n");
                sb.append("\t\tselect").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    if(!column.getEnd()){
                        sb.append("\t\t\t").append(column.getColumnName()).append(", <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }else{
                        sb.append("\t\t\t").append(column.getColumnName()).append(" <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }
                }
                sb.append("\t\tfrom ").append(table.getTableName()).append(" t where ");
                if(fun.contains("逻辑删除")){
                    sb.append("t.is_del = 0").append("\r\n");
                    sb.append("\t\tand t.").append(col.getColumnName()).append(" = #{").append(col.getLowercaseName()).append(",jdbcType=VARCHAR}").append("\r\n");
                }else{
                    sb.append("t.").append(col.getColumnName()).append(" = #{").append(col.getLowercaseName()).append(",jdbcType=VARCHAR}").append("\r\n");
                }
                sb.append("\t</select>").append("\r\n");
            }else{
                //下列字段不参与查询条件
                List<String> noUpdate = Arrays.asList("is_del","create_user_id","ctime","utime");
                sb.append("\r\n");
                sb.append("\t<!-- 查询").append(table.getPojoName()).append("列表 -->").append("\r\n");
                sb.append("\t<select id=\"select").append(table.getPojoKey()).append("ByList\" resultMap=\"").append(table.getUpojoKey()).append("ResultMap\">").append("\r\n");
                sb.append("\t\tselect").append("\r\n");
                for(TableColumns column: table.getColumns()){
                    if(!column.getEnd()){
                        sb.append("\t\t\tt.").append(column.getColumnName()).append(", <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }else{
                        sb.append("\t\t\tt.").append(column.getColumnName()).append(" <!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    }
                }
                sb.append("\t\tfrom ").append(table.getTableName()).append(" t where ");
                if(fun.contains("逻辑删除")){
                    sb.append("t.is_del = 0").append("\r\n");
                }else{
                    sb.append("1=1").append("\r\n");
                }
                boolean isCtime = false;
                TableColumns isProject = null;
                for(TableColumns column: table.getColumns()){
                    if("ctime".equals(column.getColumnName())){
                        isCtime = true;
                    }
                    if(noUpdate.contains(column.getColumnName())){
                        continue;
                    }
                    if("projectId".equals(column.getLowercaseName())){
                        isProject = column;
                    }
                    sb.append("\t\t<!-- ").append(column.getColumnComment()).append(" -->").append("\r\n");
                    sb.append("\t\t<if test=\"json.").append(column.getLowercaseName()).append(" != null\">").append("\r\n");
                    sb.append("\t\t\tand t.").append(column.getColumnName()).append(" = #{json.").append(column.getLowercaseName()).append(",jdbcType=").append(column.getDataType()).append("}").append("\r\n");
                    sb.append("\t\t</if>").append("\r\n");
                }
                //如果字段中包含项目id 并且是客户应用 则增加权限查询
                if(null != isProject){
                    sb.append("\t\t<!-- 项目权限 -->").append("\r\n");
                    sb.append("\t\t<if test=\"@com.chao.common.util.RequestUtile@isLoginUserRole() != null\">").append("\r\n");
                    sb.append("\t\t\tand t.").append(isProject.getColumnName()).append(" in (\n");
                    sb.append("\t\t\t\tselect pu.project_id from yh_project_user pu where pu.user_id = ${@com.chao.common.util.RequestUtile@isLoginUserRole()}\r\n");
                    sb.append("\t\t\t)\r\n");
                    sb.append("\t\t</if>").append("\r\n");
                }
                if(isCtime){
                    sb.append("\t\torder by t.ctime DESC").append("\r\n");
                }
                sb.append("\t</select>").append("\r\n");
            }
            sb.append("</mapper>").append("\r\n");
            out.write(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
